/*
 * Copyright © 2019 wkang. All rights reserved.
 */

package main

type Bag struct {
	items []int
}

func NewBag(items []int) *Bag {
	return &Bag{items: items}
}

func (b *Bag) Insert(itemId int) {
	b.items = append(b.items, itemId)
}

func main() {
	// 任何类型都可以有方法 不仅仅是结构体，
	// 但是不应该是接口类型 因为接口类型是抽象类
	// 类型的代码和绑定在之上的方法可以不放置在一起，不在同一个源文件，但是必须是同一个包的
	// 方法不允许重载，也就是同一类型只能有一个给定名称的方法。
	// 但是不同类型之间 名称可以相同
	// Now begin
	b := NewBag([]int{})
	b.Insert(5)
	// 下面详细说接收器
	// 接收器格式
	// func (接收器变量 接收器类型) 方法名(入参列表)(出参列表){
	//     函数体
	// }
	// 接收器就是方法作用的目标
	// 1. 指针类型的接收器
	// 指针类型的接收器是有一个结构体指针组成的，类似面向对象的this或者self
	// 调用方法时 修改接收器指针的任意成员变量，在方法结束之后 修改都是有效的
	// 2. 非指针类型的接收器
	// 当方法作用于非指针接收器的时候 会将接收器的值复制一份，方法可以获取接收器的值，但是修改后无效

	// 如何选择
	// 当用于大对象时 因为复制效率低 所以使用指针接收器
	// 当用于小对象时 因为复制效率高 所以用费指针接收器 使用返回值来接收改动后的值
}
